/**
 * @author LARAKI Meryem, MATHIEU Renaud
 * <h1>ESIAL 2A - PIDR 2010 </h1>
 * <h2>Modelisation de connaissances et competences informatiques</h2>
 */

package graphique;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Set;

import javax.swing.BorderFactory;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;

import modele.Parser;
import modele.Recherche;

import com.hp.hpl.jena.rdf.model.Resource;

public class VueRecherche extends JPanel {
	private static final long serialVersionUID = 1L;

	// --------------------
	// Attributs
	// --------------------
	public Parser parser;
	public Recherche process;

	private JLabel labelChoisirOffre;
	private JLabel labelOffreChoisie;
	private JButton recherche;
	
	private JLabel labelCibler;
	private JComboBox competences;
	private JButton rechercheAvancee;

	// --------------------
	// Constructeur
	// --------------------
	public VueRecherche(Parser parser,
			VueAfficherIndividusOntologie vuePrintIndividus) {
		this.parser = parser;

		// Creation des elements graphiques
		labelChoisirOffre = new JLabel("Choisir une offre d'emploi :");
		labelOffreChoisie = new JLabel("Vous n'avez pas selectionne d'offre");
		recherche = new JButton("Rechercher");
		
		labelCibler = new JLabel("Cibler competence :");
		competences = new JComboBox();
		rechercheAvancee = new JButton("Recherche ciblee");
		
		// Actions
		recherche.addActionListener(new ActionRecherche());
		rechercheAvancee.addActionListener(new ActionRechercheCiblee(parser));
		
		// Ajout des elements graphiques
		Container cont = new Container();
		GroupLayout layout = new GroupLayout(cont);
		cont.setLayout(layout);
		
	    layout.setAutoCreateContainerGaps(true);
	    layout.setAutoCreateGaps(true);
	    
	    layout.setHorizontalGroup(
	    		   layout.createSequentialGroup()
	    		      .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
	    		    		  .addComponent(labelChoisirOffre)
	    		    		  .addComponent(labelOffreChoisie)
	    		    		  .addComponent(labelCibler))
	    		    		  .addComponent(competences)
	    		      .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
	    		           .addComponent(recherche)
	    		           .addComponent(rechercheAvancee))
	    		);
	    
	    		layout.setVerticalGroup(
	    		   layout.createSequentialGroup()
	    		   	  .addComponent(labelChoisirOffre)
	    		      .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
	    		           .addComponent(labelOffreChoisie)
	    		           .addComponent(recherche))
	    		      .addGap(20)
	    		      .addComponent(labelCibler)
	    		      .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
	    		           .addComponent(competences)
	    		           .addComponent(rechercheAvancee))
	    		);
	    
	    add(cont, SwingUtilities.CENTER);
		
		// Options
		labelOffreChoisie.setForeground(Color.red);
		labelChoisirOffre.setForeground(Color.blue);
		labelCibler.setForeground(Color.blue);
		ComboBoxRenderer renderer = new ComboBoxRenderer();
		competences.setRenderer(renderer);
		
		// Options du JPanel
		TitledBorder afact = BorderFactory.createTitledBorder("Recherche");
		afact.setTitleJustification(TitledBorder.CENTER);
		setBorder(afact);
	}

	// --------------------
	// Methodes
	// --------------------
	public JLabel getLabelOffreChoisie() {
		return labelOffreChoisie;
	}

	public void setLabelOffreChoisie(String labelOffreChoisie) {
		this.labelOffreChoisie.setText(labelOffreChoisie);
	}


	public Recherche getRecherche() {
		return process;
	}

	public void setRecherche(Recherche process) {
		this.process = process;
		
		for(int i = 0 ; i < process.getCompetencesOffre().size() ; i++){
			competences.addItem(process.getCompetencesOffre().get(i));
		}
	}


	// --------------------
	// Actions
	// --------------------
	private class ActionRecherche implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			
			if(labelOffreChoisie.getText().compareTo("Vous n'avez pas selectionne d'offre") != 0){
								
				//Nombre de competences requises
				int nbCompetencesRequises =  process.getCompetencesOffre().size();
				Set<Resource> cles = process.getPersonneCompetentes().keySet();
				for (Resource cle : cles) {
					String msg;
					int taux = process.getPersonneCompetentes().get(cle).size()*100/nbCompetencesRequises;
					msg = cle.getLocalName()+" "+taux+"% : ";
					for(int i = 0 ; i < process.getPersonneCompetentes().get(cle).size() ; i++){
						msg += "\n\t"+process.getPersonneCompetentes().get(cle).get(i).getLocalName();
					}
					
					JOptionPane.showMessageDialog(null, msg);
				}
			}else{
				JOptionPane.showMessageDialog(null,
						"Vous n'avez pas selectionne d'offre d'emploi",
					    "Attention",
					    JOptionPane.WARNING_MESSAGE);
			}
		}
	}
	
	
	private class ActionRechercheCiblee implements ActionListener {
		
		private Parser parser;
		
		public ActionRechercheCiblee(Parser parser){
			this.parser = parser;
		}
		
		public void actionPerformed(ActionEvent e) {
			
			if(labelOffreChoisie.getText().compareTo("Vous n'avez pas selectionne d'offre") != 0){
				Resource competenceSelectionnee = (Resource) competences.getSelectedItem();
				System.out.println(competenceSelectionnee);
				
				Recherche rechercheAvancee = new Recherche(this.parser, labelOffreChoisie.getText());
				
				rechercheAvancee.getCompetencesOffre().clear();
				rechercheAvancee.getCompetencesEsialiens().clear();
				rechercheAvancee.getPersonneCompetentes().clear();
				
				rechercheAvancee.getCompetencesOffre().add(competenceSelectionnee);
				
				rechercheAvancee.initCompetencesEsialiens();
				rechercheAvancee.matchingProcess();
				
				//Nombre de competences requises
				int nbCompetencesRequises =  rechercheAvancee.getCompetencesOffre().size();
				Set<Resource> cles = rechercheAvancee.getPersonneCompetentes().keySet();
				for (Resource cle : cles) {
					String msg;
					int taux = rechercheAvancee.getPersonneCompetentes().get(cle).size()*100/nbCompetencesRequises;
					msg = cle.getLocalName()+" "+taux+"% : ";
					for(int i = 0 ; i < rechercheAvancee.getPersonneCompetentes().get(cle).size() ; i++){
						msg += "\n\t"+rechercheAvancee.getPersonneCompetentes().get(cle).get(i).getLocalName();
					}
					
					JOptionPane.showMessageDialog(null, msg);
				}
				
			}else{
				JOptionPane.showMessageDialog(null,
						"Vous n'avez pas selectionne d'offre d'emploi",
					    "Attention",
					    JOptionPane.WARNING_MESSAGE);
			}
		}
	}
	
	private class ComboBoxRenderer extends JLabel implements ListCellRenderer {
		private static final long serialVersionUID = 1L;

		@Override
		public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
			if(value instanceof Resource){
				setText(((Resource)value).getLocalName());
			}
			return this;
		}
		
	}
	
}
